import { defineStore } from 'pinia'
import { XStream } from 'ant-design-x-vue';
import { reactive, ref } from 'vue';
interface messages{
  role:string,
  content:string
}

//  `defineStore()` 的返回值的命名是自由的
// 但最好含有 store 的名字，且以 `use` 开头，以 `Store` 结尾。
// (比如 `useUserStore`，`useCartStore`，`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const aiMessage = defineStore('aiMessage', {
  // 其他配置...
  state: () => {
    return {
     messages:[
      { role: 'system', content: '系统提示词' },
     ],
     //用户消息，打字内容，同步渲染到列表上
     userMessage:"",
     //用于提供发送给后端的消息
     sessionMessages:{
      sessionId:"",
      userId:"",
      messages:<messages[]>[]
     }
    }
  },
  getters: {
    getMessages(state){
      return state.messages;
    },
    getUserMessage(state){
      return state.userMessage;
    }
  },
  actions: {
    userSendMessage(msg:string){
      //先清空之前的消息
      this.sessionMessages.messages = []
      //存储上一次AI回复的消息，和新的用户消息，判空 如果我是第一个问ai问题 就没有上一次AI回复的消息
      if(this.messages.length>0 && this.messages[this.messages.length-1].role==='ai'){
        this.sessionMessages.messages.push(this.messages[this.messages.length-1]); //上一次AI回复
      }
      this.sessionMessages.messages.push({ role: 'user', content: msg });//新的用户消息
      //存放用户id和会话id
      this.sessionMessages.sessionId = "session_123456"; //当前会话Conversation  直接用ant-design-x-vue的信息
      this.sessionMessages.userId = "user_123456";  //项目中，用户的id是由pinia存储的
      //把用户消息放到消息列表中，才能渲染到页面上
      this.messages.push({ role: 'user', content: msg });
      this.userMessage= msg; //展示没用
      const ai_result = reactive({ role: 'ai', content: ''})
      //发送给后端，然后后端AI回复
      fetch('http://localhost:8080/ai/stream', {
        method:"POST",
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(this.sessionMessages)
      }).then(async (response) => {
        //把AI回复放到消息列表中
        this.messages.push(ai_result);
        // for await (const chunk of XStream({
        //    readableStream: response.body,
        // })) {
        //   console.log(chunk.data);
        //   ai_result.content += chunk.data;
        // }
        const reader = response.body?.getReader()
        const textDecoder = new TextDecoder("utf-8");
        while(true){
          const {done,value} = await reader.read();
          if(done) break;
          const chunk = textDecoder.decode(value).replace(/data:/g,'').replace(/\n\n/g,'');
          console.log(chunk);
          ai_result.content += chunk;
        }
      }).catch((error) => {});

    }
  },
})